﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Interfaces;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Model
{
    [Serializable]
    public class Turnering : Interfaces.ITurnering
    {
        #region Attributes
        private string turneringsnavn, gruppenavn;
        private DateTime startdato;
        private int antalRunder, turneringsID = 0;
        private Deltager aktuelDeltager;
        private List<Deltager> listeDeltagere;
        #endregion

        #region Konstruktør
        public Turnering(string turneringsnavn, string gruppenavn, DateTime startdato, int antalRunder, int turneringsID)
        {
            this.turneringsnavn = turneringsnavn;
            this.gruppenavn = gruppenavn;
            this.startdato = startdato;
            this.antalRunder = antalRunder;
            this.turneringsID = turneringsID;
            listeDeltagere = new List<Deltager>();
        }
        #endregion

        #region Metoder
        public Deltager TilføjDeltager(string fornavn, string efternavn, string klub, int nr, int deltagerID, int rating, double korrektion)
        {
            Deltager deltager = new Deltager(fornavn, efternavn, klub, nr, deltagerID, rating, korrektion);
            listeDeltagere.Add(deltager);
            return deltager;
        }

        // Leder listen igennem for et bestem deltagerID
        public Deltager FindDeltager(int deltagerID)
        {
            foreach (Deltager midlertidigDeltager in listeDeltagere)
            {
                if (midlertidigDeltager.DeltagerID == deltagerID)
                {
                    return midlertidigDeltager;
                }
            }
            return null;
        }

        public void FlytDeltager(int deltagerID, int nyPlacering)
        {
            aktuelDeltager = FindDeltager(deltagerID);

            // Erstatter den nuværende placering med nyPlacering.
            aktuelDeltager.Nr = nyPlacering;
        }

        public void FjernDeltager(int deltagerID)
        {
            int rækkefølge;

            // Finder deltager der skal slettes
            aktuelDeltager = FindDeltager(deltagerID);
            rækkefølge = aktuelDeltager.Nr;

            // Sletter deltager fra listen
            listeDeltagere.Remove(aktuelDeltager);

            // Forhver deltager på listeDeltagere, hvis nuværendeDeltager.Nr er støre end den slettes deltager nr
            // Rykkes personen 1 op på listen.
            foreach (Deltager nuværendeDeltager in listeDeltagere)
            {
                if (nuværendeDeltager.Nr > rækkefølge)
                {
                    nuværendeDeltager.Nr = (nuværendeDeltager.Nr - 1);
                }
            }
        }

        public IEnumerator GetDeltagerIterator()
        {
            return listeDeltagere.GetEnumerator();
        }
        #endregion

        #region Properties
        public string Turneringsnavn
        {
            get { return turneringsnavn; }
            set { turneringsnavn = value; }
        }

        public string Gruppenavn
        {
            get { return gruppenavn; }
            set { gruppenavn = value; }
        }

        public DateTime Startdato
        {
            get { return startdato; }
            set { startdato = value; }
        }

        public int AntalRunder
        {
            get { return antalRunder; }
            set { antalRunder = value; }
        }

        public int TurneringsID
        {
            get { return turneringsID; }
        }

        public List<Deltager> ListeDeltagere
        {
            get { return listeDeltagere; }
        }
        #endregion
    }
}
